#include "../header.h"


//1.socket : 建立套接字
//2.connect : 链接 服务端。
//3. 读写: send/recv
//4.关闭  close shudown(cid,SHUT_RDWR);
/**
 * @函数原型:  int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
 * @函数功能:  与一个已经存在的套接字进行连接
 * @参数说明: 
 * @       参数1: sockfd : 套接字
 * @       参数2: const struct sockaddr *addr : 服务端的地址结构体。
 * @       参数3: addrlen : 地址长度
 * @返回值: 成功返回0 失败返回-1；
 * @param {int} argc
 */
int main(int argc, char const *argv[])
{
    if(argc < 3)
    {
        perror("argc error\n");
        return -1;
    }
    //建立客户端套接字
    int cid = socket(AF_INET,SOCK_STREAM,0);
    printf("cid = %d\n",cid);

    //connect
    struct sockaddr_in caddr = {0};
    caddr.sin_family = AF_INET;
    caddr.sin_port = htons(atoi(argv[2]));
    caddr.sin_addr.s_addr = inet_addr(argv[1]);
    if(connect(cid,(struct sockaddr*)&caddr,sizeof(caddr)) < 0 )
    {
        perror("connect error\n");
        return -3;
    }
    printf("connect successful\n");

    char bufs[128] = "";
    char bufn[128] = "";
    char bufm[128] = "";
    int len = 0 ;
    //循环读写
    while(1)
    {
        //清空三个缓冲区
        bzero(bufs,sizeof(bufs));
        bzero(bufn,sizeof(bufn));
        bzero(bufm,sizeof(bufm));
        //先写 - 从键盘读数据再写给对面
        read(STDIN_FILENO,bufs,sizeof(bufs)-1);   
        if(!strncmp(bufs,"quit",4))
        {
            printf("客户端正在退出...\n");
            break;
        }
        //sizeof
        send(cid,bufs,strlen(bufs),0);

        //再读 
        len = recv(cid,bufn,sizeof(bufn),0);
        strncpy(bufm,bufn,len-2);
        printf("服务端发送过来的数据是:%s %d\n",bufm,len);
    }
    //
    shutdown(cid,SHUT_RDWR);

    return 0;
}
